home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-04-30 | 45.7 KB | 1,329 lines |
- 16Aug93/0426 Subject: re: tfstx/ingocom Bulletin ID: 12830IDL8HBS
- Path: DB0RBS!DB0MWE!DB0KCP!HB9OS!HB9EAS!DB0GE!DB0HOM!DB0AIS!DB0SIF!DB0EAM
- !DK0MAV!DB0DNI!DK0MNL!DL8HBS de DL8HBS @ DL8HBS to ATARI @ ALLE
- Guten Tag,
- alle wollen TFSTX, keiner schreibt es...
-
- Ich spiele im nachfolgenden 7PLUS-LZH-Archiv die Original-Assembler
- - Sourcen zum dekodieren eines Modems am RI-Eingang der seriellen
- Schnittstelle des ST ein. Die Source ist vom INGOCOM-Autor DH5MBC,
- ich weiss leider nicht, wie ich ihn erreichen kann, nehme aber an,
- dass er mit ........ sind mir noch einige
- Fehler unterlaufen, deswegen läuft es noch nicht so, wie es soll.
-
- Ich habe keine Zeit und auch keine Veranlassung, die Fehler zu
- finden. Ich musste meinen TNC am Modem anzapfen, um an die
- benötigten Signale zu kommen, also was soll der Aufwand für mich
- hi.
-
- Sollte sich jemand die Mühe machen, die von mir optimierte Source
- fehlerzubereinigen, so werde ich Mittel und Wege finden, das an
- einen residenten TF2.6-Treiber anzubinden.
-
- Die Sourcen sind nur zur nichtkommerziellen Verwendung frei, die
- Arbeitsergebnisse müssen! wiederum der Allgemeinheit zur Verfügung
- gestellt werden.
- Wer sich nicht daran hält kriegt Ärger!
- Gruss, Joachim
- DL8HBS @ DB0GR
- P.S.: Wollen wir doch mal sehen, ob noch jemand für den ST
- programmiert, wie gesagt, prinzipiell gehen tut es.
-
- ; Dies ist die Originalsource zum Emfang von INGOCOM von DH5MBC
- ; Eine kommerzielle Verwertung ist untersagt, die verbesserten
- ; Sourcen sind der Allgemeinheit zur Verfüfgung zu stellen!
- ; Die Einspielung erfolgt von DL8HBS, ich nehme an, DH5MBC ist
- ; damit einverstanden. Ich weiss nicht, wie ich ihn erreichen sollte.
-
- .GLOBL Empfang,restore,stazei,timer_ve,timerdat1,tim_dcont,taste
- .GLOBL scroll,Spuriosinterrupt
-
- inter_mask_reg equ $fffa15
- int_enable_reg equ $fffa06
- int_serv_reg_a equ $fffa0e
- int_serv_reg_b equ $fffa10
- aktive_edge_reg equ $fffa03
- timerdat equ $fffa1e
- timercont equ $fffa18
- serialport equ $fffa00
- vblsem equ $00000452
- keyvec equ $00118
- rivec equ $00138
- timer_a_vec equ $00134
- spurios_vec equ $00060
-
- Empfang: move.l a0,sichadr ;a0 = anfang empfangsspeicher
- addq.l #2,a0 ;erste 2 bytes fuer zahl der empf.
- move.l a0,adresse ;byte reserviert
-
- movem.l d0-d7/a0-a6,-(sp) ;register sichern
-
- move.w #255,timerdat1 ;timer auf 1200 baud
- move.w #5,tim_dcont
-
- pea 0 ;supervisor
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- move.l d0,savestack ;stackpointer retten
-
- lea Neutast,a4 ;tastaurinterrupt
- move.l keyvec,a3 ;XBRA
- move.l a3,-4(a4)
-
- pea Neutast
- move.w #06,-(sp)
- move.w #$d,-(sp) ;neuen interruptvector Tastint
- trap #14 ; übergeben
- addq.l #8,sp
-
- lea.l Start,a4 ;XBRA ri
- move.l rivec,a3
- move.l a3,-4(a4)
-
- pea Start(pc) ;interruptvector übergeben
- move.w #14,-(sp)
- move.w #$d,-(sp)
- trap #14
- addq.l #8,sp
-
- move.w #14,-(sp) ;ri interrupt noch sperren
- move.w #$1a,-(sp)
- trap #14
- addq.l #4,sp
-
- lea Timerinterr,a4
- move.l a4,timer_ve
- ;XBRA timerint
- movea.l timer_a_vec,a3
- move.l a3,-4(a4)
-
- pea Timerinterr ;timer setzen
- move.w #255,-(sp) ;1200 baud
- move.w #0,-(sp) ;noch nicht starten
- move.w #0,-(sp) ;timer A
- move.w #$1f,-(sp)
- trap #14
- lea.l $c(sp),sp
-
- lea Spuriosinterr,a4 ;spurios interrupt verbiegen
- movea.l spurios_vec,a3
- move.l a3,-4(a4)
- move.l a4,spurios_vec
-
- move.l savestack,-(sp) ;supervisor aus
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- move.w #15,vergleichwert ;anfangsparmeter setzen
- move.w #32,bitwert
- move.w #208,synchwert
- move.w #0,ri_flag
- move.w #0,synch_flag
-
- movem.l (sp)+,d0-d7/a0-a6 ;register restaurieren
- move.l #byteflag,d0
- movea.l d0,a0 ;rueckgabe ist adresse und turbo-c will
- rts ;das in a0
-
- .EVEN
-
- XBRAta: .DC.b 'X','B','R','A'
- .DC.b 'D','C','S','T'
- .DC.l 0
- Neutast:
- move.l a0,a0sich ;register A0 sichern
- ori.w #$0700,sr ;interruptlevel auf 5 setzen
- andi.w #$f5ff,sr ;somit ri_interrupt waehrend
- ;tastaturinterrupt moeglich
-
- lea Neutast,a0 ;normale Tastaturinterruptroutine
- move.l -4(a0),-(sp) ;anspringen
- move.l a0sich,a0
- rts
-
- a0sich: dc.l 0
-
- .EVEN
- XBRAri: .DC.b 'X','B','R','A'
- .DC.b 'D','C','S','T'
- .DC.l 0
-
- Start:
- movem.l d0-d7/a0-a6,-(sp) ;register sichern
- move.w #0,vblsem
- bsr ri_int
-
-
- movem.l (sp)+,d0-d7/a0-a6 ;register herstellen
-
- move.w #191,int_serv_reg_a ;interrupt in service loeschen
- ori.w #96,int_enable_reg ;ri und timer int freigeben
-
- rte
-
- ri_int:
-
- andi.w #159,int_enable_reg ;timer und ri interrupt sperren
- bchg #6,aktive_edge_reg ;naechster interrupt bei anderer flanke
-
- move.l #255,d0 ;d0 = 255 - timerdat
- sub.b $fffa1f,d0 ;entspricht timerschritte seit letztem interrupt
-
- move.w #0,d4
- move.w bytecount,d5
- move.l adresse,a3
- cmpi.w #0,ri_flag
- bne kein_sta_zei
- move.w #-1,status
-
- kein_sta_zei:
- move.w #-1,ri_flag
-
- move.w #0,timercont ;timer neu
- move.w timerdat1,timerdat ;starten
- move.w tim_dcont,timercont
- ori.w #32,int_enable_reg
- move.w #223,int_serv_reg_a
-
- kein_rueck:
- move.w vorher,d3
- move.w d0,vorher
-
- cmpi.w #0,synch_flag ;wenn synchronisation noch nicht
- beq loop ;erfolgte ist kein stuffing möglich
-
- cmpi.w #0,d5 ;sind bereits bytes empfangen worden
- bne evtl_endsynch ;muss ein impuls > 7*32-16 ein endsynch sein
-
- cmp.w synchwert,d0
- bge ri_ruecksprung
- cmp.w synchwert,d3
- bge ri_ruecksprung
- bra kein_7E
-
- evtl_endsynch:
- cmp.w synchwert,d3
- bge frame_end
-
-
- kein_7E:
- move.w d3,d0
- loop:
- move.w byte,d1 ;bis jetzt empf byte nach d1
- sub.w bitwert,d0 ;timerschritte minus bitwert
-
- cmp.w vergleichwert,d0 ;wenn rest > 16
- ble null_setzten
-
- bset #7,d1 ;war empf bit eine 1
- addq.w #1,d4
- bra vergleich
-
- null_setzten: ;sonst war es eine null
- bclr #7,d1
- cmpi.w #5,d4
- bne mach_null
- move.w #0,d4
- bra nix_schiebens
-
- mach_null:
- move.w #0,d4
- vergleich:
-
- cmpi.w #0,synch_flag ;wenn synchbyte schon empf
- bne aufnahme ;dann springe zu aufnahme
-
- cmpi.w #$7e,d1 ;wenn byte in d1 = 7e = synchronbyte
- bne schieben
-
- move.w #0,bitcount
- move.w #0,byte
- move.w #0,d4
- move.w #$ff,synch_flag ;synchronflag setzten
-
- bra nix_schiebens
-
- aufnahme:
- cmpi.w #7,bitcount
- bne schieben
-
- move.b d1,(a3)+ ;byte in adresse schreiben
- ;und adresse um eins erhöhen
-
- move.w #0,bitcount ;bitcount =0
- move.w #0,byte
- addq.w #1,d5
-
- bra nix_schiebens
-
- schieben:
- lsr.b #1,d1 ;byte um 1 stelle nach rechts schiebne
- move.w d1,byte
- addq.w #1,bitcount
-
- nix_schiebens:
-
- cmp.w vergleichwert,d0 ;wenn wert in d0 >16
- ble ri_ruecksprung
- bra loop ;dann zu neuem durchlauf
-
- ri_ruecksprung:
- move.w d5,bytecount
- move.l a3,adresse
- rts ;ruecksprung
-
- .EVEN
-
- frame_end:
-
- movea.l sichadr,a0
- move.w d5,d3 ;anzahl der empfangenen bytes sichern
- move.b d3,(a0)+
- lsr.w #8,d3
- move.b d3,(a0)
- move.w #0,d5 ;bytecount =0
- move.l a3,sichadr
- addq.l #2,a3
- move.l a3,adresse
- move.w #0,bitcount
- move.w #0,synch_flag
- bra ri_ruecksprung
-
- XBRAti: .DC.b 'X','B','R','A'
- .DC.b 'D','C','S','T'
- .DC.l 0
-
-
- Timerinterr:
-
- movem.l d0-d7/a0-a6,-(sp) ;register sichern
- bsr ri_int
- ausis:
- move.w #0,bytecount ;parameter reseten
- move.w #0,ri_flag
- move.w #-1,status
- move.w #1,vblsem
-
- move.w #0,synch_flag
- move.l sichadr,a3
- addq.l #2,a3
- move.l a3,adresse
-
- move.w #0,timercont ;timer neu
- move.w timerdat1,timerdat ;einstellen
-
- movem.l (sp)+,d0-d7/a0-a6 ;register herstellen
- move.w #159,int_serv_reg_a ;timer u ri interrupt ist beendet
- ori.w #96,int_enable_reg ;timer u. ri int freigeben
-
- rte
-
- restore:
- movem.l d0-d7/a0-a6,-(sp) ;register sichern
- pea 0 ;supervisor
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- lea.l Start,a0 ;ri zeiger zuruecksetzen
- move.l -4(a0),rivec
-
- lea.l Timerinterr,a0 ;ti zeiger zuruecksetzen
- move.l -4(a0),timer_a_vec
-
- lea.l Spuriosinterr,a0 ;sp_int zeiger zuruecksetzen
- move.l -4(a0),spurios_vec
-
- lea.l Neutast,a0 ;tastatur zeiger zuruecksetzen
- move.l -4(a0),keyvec
-
- move.l savestack,-(sp) ;supervisor aus
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- movem.l (sp)+,d0-d7/a0-a6 ;register herstellen
-
- rts
-
- .EVEN
-
- XBRAsp: .DC.b 'X','B','R','A'
- .DC.b 'D','C','S','T'
- .DC.l 0
-
- Spuriosinterr:
- bra Timerinterr
-
- scroll:
- cmpi.w #0,d0
- beq scrollret
- move.l a0,a1
- add.l #84,a1
- scrolloop:
- move.l (a1)+,(a0)+
- dbf d0,scrolloop
- scrollret:
- rts
-
-
- savestack: .DC.l 0
- byteflag: .DC.w 0
- bytecount: .DC.w 0
- adresse: .DC.l 0
- sichadr: .DC.l 0
- timerdat1: .DC.w 0
- tim_dcont: .DC.w 0
- vergleichwert: .DC.w 0
- synch_flag: .DC.w 0
- ri_flag: .DC.w 0
- synchwert: .DC.w 0
- bitwert: .DC.w 0
- bitcount: .DC.w 0
- status: .DC.w 0
- byte: .DC.w 0
- vorher: .DC.w 0
- timer_ve: .DC.l 0
- oldkey: .DC.l 0
-
-
-
- .EVEN
-
- * Dies ist eine bereits hochoptimierte Version von DH5MBC's Sourcen,
- * die Optimierungen sind von DL8HBS. Leider sind sie noch nicht ganz
- * fehlerfrei.
- * Ich würde diese Version überarbeiten und insbesondere die Variablen-
- * zugriffe nocheinmal genauestens überprüfen sowie die Verwendung von
- * Byte-Zugriffen auf die I/O-Adressen anstelle der originalen Word-
- * Zugriffe. Mit geladenem HSMODEM sollte die Interruptbearbeitung
- * dieser Version so schnell sein, dass sich Maus, Tastatur und
- * serielle Schnittstelle nicht gegenseitig aus'interrupten'.
- * Jegliche kommerzielle Verwertung ist untersagt, hieraus hervorge-
- * gangene verbesserte Sourcen MÜSSEN der Allgemeinheit zur Verfügung
- * gestellt werden.
- * Joachim Schurig, DL8HBS, 12/08/93
-
- .GLOBL AX_RX_ON,AX_RX_OFF ; Empfang, restore ...
-
- * .XDEF stazei,timer_ve,timerd1,tim_dcont,taste
- * .GLOBL scroll,Spuriosinterr
-
- inter_mask_reg equ $00fffa15
- int_enable_reg equ $00fffa07
- int_serv_reg_a equ $00fffa0f
- aktive_edge_reg equ $00fffa03
- timerdat equ $00fffa1f
- timercont equ $00fffa19
- vblsem equ $00000452
- keyvec equ $00118
- rivec equ $00138
- timer_a_vec equ $00134
- spurios_vec equ $00060
-
-
- .text
-
- * function AX_RX_ON(adresse:long_integer):long_integer; external;
-
- AX_RX_ON: move.l 4(sp),d0 ;ADRESSE nach d0
-
- movem.l d0-d7/a0-a6,-(sp) ;register sichern
-
- lea parms,a4
- move.l a4,a2
- move.w #(lastparm-parms)/2,d1
- clr_lp: clr.w (a2)+
- dbra d1,clr_lp
-
- move.l d0,sichadr-parms(a4) ;d0 = anfang empfangsspeicher
- addq.l #2,d0 ;erste 2 bytes fuer zahl der empf.
- move.l d0,adresse-parms(a4) ;byte reserviert
-
- move.w #255,timerd1-parms(a4) ;timer auf 1200 baud
- move.w #5,tim_dcont-parms(a4)
-
- clr.l -(sp) ;supervisor
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- move.l d0,savestack-parms(a4) ;stackpointer retten
-
- lea Neutast(pc),a4 ;tastaurinterrupt
- move.l keyvec,a3 ;XBRA
- move.l a3,-4(a4)
-
- move.l a4,-(sp)
- move.w #06,-(sp)
- move.w #$d,-(sp) ;neuen interruptvector Tastint
- trap #14 ;übergeben
- addq.l #8,sp
-
- lea Start(pc),a4 ;XBRA ri
- move.l rivec,a3
- move.l a3,-4(a4)
-
- move.l a4,-(sp)
- move.w #14,-(sp)
- move.w #$d,-(sp)
- trap #14
- addq.l #8,sp
-
- move.w #14,-(sp) ;ri interrupt noch sperren
- move.w #$1a,-(sp)
- trap #14
- addq.l #4,sp
-
- lea TimerAint(pc),a4
- move.l a4,timer_ve
- movea.l timer_a_vec,a3
- move.l a3,-4(a4)
- move.l a4,-(sp)
- move.w #255,-(sp) ;1200 baud
- move.w #0,-(sp) ;noch nicht starten
- move.w #0,-(sp) ;timer A
- move.w #$1f,-(sp)
- trap #14
- lea.l $c(sp),sp
-
- lea Spuriosinterr(pc),a4 ;spurios interrupt verbiegen
- movea.l spurios_vec,a3
- move.l a3,-4(a4)
- move.l a4,spurios_vec
-
- move.l savestack,-(sp) ;supervisor aus
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- move.w #15,vglwert-parms(a4) ;anfangsparmeter setzen
- move.w #32,bitwert-parms(a4)
- move.w #208,synchwert-parms(a4)
- clr.w ri_flag-parms(a4)
- clr.w synch_flag-parms(a4)
-
- movem.l (sp)+,d0-d7/a0-a6 ;register restaurieren
- move.l #byteflag,d0
-
- * movea.l d0,a0 ;rueckgabe ist adresse und turbo-c will
- * rts ;das in a0
-
- * Nun, so sieht das in Pascal aus:
- move.l (sp)+,a0
- addq.l #4,sp
- jmp (a0)
-
- * procedure AX_RX_OFF;external;
-
- AX_RX_OFF:
- movem.l d0-d7/a0-a6,-(sp) ;register sichern
- clr.l -(sp) ;supervisor
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- lea Start(pc),a0 ;ri zeiger zuruecksetzen
- move.l -4(a0),rivec
-
- lea TimerAint(pc),a0 ;ti zeiger zuruecksetzen
- move.l -4(a0),timer_a_vec
-
- lea.l Spuriosinterr(pc),a0 ;sp_int zeiger zuruecksetzen
- move.l -4(a0),spurios_vec
-
- lea.l Neutast(pc),a0 ;tastatur zeiger zuruecksetzen
- move.l -4(a0),keyvec
-
- move.l savestack,-(sp) ;supervisor aus
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- movem.l (sp)+,d0-d7/a0-a6 ;register herstellen
- rts
-
- * scroll:
- * tst.w d0
- * beq.s scrollret
- * move.l a0,a1
- * add.l #84,a1
- * scrolloop:
- * move.l (a1)+,(a0)+
- * dbf d0,scrolloop
- * scrollret:
- * rts
-
- XBRAta: .dc.b 'XBRA'
- .dc.b 'DCST'
- .dc.l 0
-
- Neutast: ori.w #$0700,sr ;interruptlevel auf 5 setzen
- andi.w #$f5ff,sr ;somit ri_interrupt waehrend
- move.l Neutast-4(pc),-(sp) ;tastaturinterrupt moeglich
- rts
-
- .dc.b 'XBRA'
- .dc.b 'DCST'
- .dc.l 0
-
- Spuriosinterr:
- bra.s TimerAint
-
- .dc.b 'XBRA'
- .dc.b 'DCST'
- .dc.l 0
-
- TimerAint: * Timer A ist abgelaufen...
- movem.l d0-d5/a0-a4,-(sp) ;register sichern
- bsr.s ri_int ;a4 wird in ri_int geladen
- clr.w -(a2) ;(bytecount)
- addq.l #2,a1 ;a1 = ^sichadr;
- move.l (a1)+,d2 ;(sichadr)
- addq.l #2,d2
- move.l d2,(a2)+ ;(adresse)
- clr.w (a2)+ ;(ri_flag)
- move.w #-1,(a1) ;(status)
- move.w #1,vblsem
- clr.w synch_flag-parms(a4)
- clr.w timercont ;timer neu
- addq.l #1,a2
- move.b (a2)+,timerdat ;(timerd1) einstellen
- movem.l (sp)+,d0-d5/a0-a4 ;register herstellen
- move.b #159,int_serv_reg_a ;timer u. ri interrupt ist beendet
- ori.b #96,int_enable_reg ;timer u. ri int freigeben
- rte
-
- .dc.b 'XBRA'
- .dc.b 'DCST'
- .dc.l 0
-
- Start: movem.l d0-d5/a0-a4,-(sp) ;register sichern
- clr.w vblsem
- bsr.s ri_int
- movem.l (sp)+,d0-d5/a0-a4 ;register herstellen
- move.b #191,int_serv_reg_a ;interrupt in service loeschen
- ori.b #96,int_enable_reg ;ri und timer int freigeben
- rte
-
- * ACHTUNG: D2 = temporäres Register für bestimmte Rechnungen in ri_int
- * A0 = temporärer Zeiger
- * A1 = temporärer Zeiger
- * A2 = temporärer Zeiger
- * A4 = temporärer Zeiger
-
- ri_int: andi.b #159,int_enable_reg ;timer und ri interrupt sperren
- bchg #6,aktive_edge_reg ;naechster interrupt bei anderer flanke
-
- moveq.l #255,d0 ;d0 = 255 - timerdat
- sub.b $fffa1f,d0 ;entspricht timerschritte seit letztem interrupt
-
- clr.w d4
- lea parms,a4 ;a4 = ^parms (bleibt so!)
- lea byte-parms(a4),a0 ;a0 = ^byte (bleibt so!)
- lea bitcount-parms(a4),a1 ;a1 = ^bitcount (bleibt so!)
- lea bytecount-parms(a4),a2 ;a2 = ^bytecount (läuft hoch!)
- move.w (a2)+,d5 ;(bytecount)
- move.l (a2)+,a3 ;(adresse)
- tst.w (a2) ;(ri_flag) evtl TAS ???
- bne.s kein_sta_zei
- move.w #-1,status-parms(a4)
-
- kein_sta_zei:
- move.w #-1,(a2)+ ;(ri_flag)
- move.b d4,timercont ;timer neu , d4 ist 0
- addq.l #1,a2
- move.b (a2)+,timerdat ;starten (timerd1)
- addq.l #1,a2
- move.b (a2)+,timercont ;(tim_dcont)
- ori.b #32,int_enable_reg
- move.b #223,int_serv_reg_a
-
- move.w (a2),d3 ;(vorher)
- move.w d0,(a2)+
-
- tst.w (a2)+ ;(synch_flag) wenn synchronisation noch nicht
- beq.s loop ;erfolgte ist kein stuffing möglich
-
- move.w (a2)+,d2 ;(synchwert)
-
- tst.w d5 ;sind bereits bytes empfangen worden
- bne.s evtl_endsynch ;muss ein impuls > 7;32-16 ein endsynch sein
-
- cmp.w d2,d0 ;(synchwert)
- bge.s ri_ruecksprung
- cmp.w d2,d3 ;(synchwert)
- bge.s ri_ruecksprung
- bra.s kein_7E
-
- frame_end addq.l #2,a1 ;(a1 = ^sichadr)
- move.l (a1),a2 ;(sichadr)
- move.w d5,d3 ;anzahl der empfangenen bytes sichern
- move.b d3,(a2)+
- lsr.w #8,d3
- move.b d3,(a2)
- clr.w d5 ;bytecount = 0
- move.l a3,(a1) ;(sichadr)
- addq.l #2,a3
- clr.w (a1) ;(bitcount)
- clr.w synch_flag-parms(a4)
- subq.l #2,a1 ;(a1 = ^bitcount)
-
- ri_ruecksprung:
- lea bytecount-parms(a4),a2
- move.w d5,(a2)+ ;(bytecount)
- move.l a3,(a2) ;(adresse)
- rts ;ruecksprung
-
- evtl_endsynch:
- cmp.w d2,d3 ;(synchwert)
- bge.s frame_end
-
- kein_7E: move.w d3,d0
-
- loop: move.l a0,a2 ;a2 steht auf ^byte
- move.w (a2)+,d1 ;(byte) bis jetzt empf byte nach d1
- sub.w (a2)+,d0 ;(bitwert) timerschritte minus bitwert
-
- cmp.w (a2),d0 ;(vglwert) wenn rest > 16
- ble.s null_setzten
-
- bset #7,d1 ;war empf bit eine 1
- addq.w #1,d4
- bra.s vergleich
-
- null_setzten: * sonst war es eine null
- bclr #7,d1
- cmpi.w #5,d4
- bne.s mach_null
- clr.w d4
- bra.s nix_schiebens
-
- mach_null clr.w d4
-
- vergleich lea synch_flag-parms(a4),a2 ;a2 = ^synch_flag
- tst.w (a2) ;(synch_flag) wenn synchbyte schon empf
- bne.s aufnahme ;dann springe zu aufnahme
-
- cmpi.w #$7e,d1 ;wenn byte in d1 = 7e = synchronbyte
- bne.s schieben
-
- move.w #$ff,(a2) ;(synch_flag) synchronflag setzten
- clr.w (a0) ;(byte)
- clr.w (a1) ;(bitcount)
- clr.w d4
- bra.s nix_schiebens
-
- aufnahme: cmpi.w #7,(a1) ;(bitcount)
- bne.s schieben
-
- move.b d1,(a3)+ ;byte in adresse schreiben und adresse um eins erhöhen
- clr.w (a1) ;(bitcount) bitcount =0
- clr.w (a0) ;(byte)
- addq.w #1,d5 ;bytecount erhöhen
- bra.s nix_schiebens
-
- schieben lsr.b #1,d1 ;byte um 1 stelle nach rechts schiebne
- move.w d1,(a0) ;(byte)
- addq.w #1,(a1) ;(bitcount)
-
- nix_schiebens:
- cmp.w vglwert-parms(a4),d0 ;wenn wert in d0 >16
- ble.s ri_ruecksprung
- bra.s loop ;dann zu neuem durchlauf
-
- .bss
-
- parms: * REIHENFOLGE DER ADRESSEN NICHT VERÄNDERN!!!!!!!!!
- timer_ve: .ds.l 1
- oldkey: .ds.l 1
- savestack: .dS.l 1
- byteflag: .ds.w 1
-
- bytecount: .ds.w 1
- adresse: .ds.l 1
- ri_flag: .ds.w 1
- timerd1: .ds.w 1
- tim_dcont: .ds.w 1
- vorher: .ds.w 1
- synch_flag: .ds.w 1
- synchwert: .ds.w 1
- byte: .ds.w 1
- bitwert: .ds.w 1
- vglwert: .ds.w 1
-
- bitcount: .ds.w 1
- sichadr: .ds.l 1
- status: .ds.w 1
-
- lastparm: .ds.w 1
-
- .end
-
-
- { Dies ist ein kleines Testprogramm zum Einbinden der Interruptroutinen }
- { DL8HBS 12/08/93 }
-
- { Stack auf 20 kByte begrenzen... }
- {$S20}
- program tfstx_test;
-
- procedure ikbdws(cnt:integer;var s:string);
- xbios(25);
-
- procedure maus_ein;
- var maus_eins : string;
- begin
- maus_eins[0] := chr($08);
- Ikbdws(0,maus_eins);
- end;
-
- procedure maus_aus;
- var maus_eins : string;
- begin
- maus_eins[0] := chr($12);
- Ikbdws(0,maus_eins);
- end;
-
- procedure main;
- var puffer,retadr:long_integer;
- ch : char;
- db : boolean;
- x : integer;
- procedure rsconf(speed,flowctl,ucr,rsr,tsr,scr:integer);
- xbios(15);
- procedure jenabint(nr:integer);
- xbios(27);
- procedure jdisint(nr:integer);
- xbios(26);
- function malloc(size:long_integer):long_integer;
- gemdos($48);
- procedure mfree(adress:long_integer);
- gemdos($49);
-
- function wpeek(adress:long_integer):long_integer;
- external;
- function AX_RX_ON(puffer:long_integer):long_integer;
- external;
- procedure AX_RX_OFF;
- external;
-
- begin
- puffer := malloc(20000);
- if puffer > 0 then begin
- Rsconf(7,0,0,-1,1,0);
- retadr := AX_RX_ON(puffer);
- maus_aus;
- Jenabint(14);
- repeat
- read(ch);
- if ch = 's' then begin
- for x := 0 to 24 do write(wpeek(retadr+x*2),' ');
- writeln;
- end;
- until ch = 'q';
- Jdisint(14);
- Jdisint(13);
- AX_RX_OFF;
- mfree(puffer);
- maus_ein;
- end;
- end;
-
- begin
- main;
- end.
-
-
- 20Aug93/1124 Subject: tfstx-source (modified) Bulletin ID: 38852_PI8DRE
- Path: DB0RBS!DK0MTV!DB0LJ!DB0SGL!DK0MWX!PI8AIR!PI8DRE
- From: PA3FUL@PI8DRE.NLD.EU To : ATARI@ALLE Hallo Atarianer,
- Habe in der Source von tfstx, 12/8/93 eingespielt von Joachim, DL8HBS,
- herumgewühlt und der Assembler gibt nun keine Fehlermeldungen mehr.
- Weiter habe ich die Source kontrolliert, speziell die
- Byte-Zugriffe auf die Register der MFP. Auch habe ich das Programm noch
- etwas weiter optimiert und "position-independent" gemacht.
- Die Routinen sind nicht geändert. Ich weiß zu wenig von der Sache um
- das erfolgreich zu tun. Es scheint mir, daß das Programm wartet auf ein
- $7E, das SynchronByte, dann Daten synchron empfangt und weitergibt,
- bis ein weiteres Synchronbyte detektiert wird.
- Ich habe kein Pascal compiler oder HS-MODEM, so ich kann das Programm
- nicht testen.
- Ich würde mich freuen wenn jemand etwas mit dieser modifizierte
- Source machen kann.
- 73 de Piet, PA3FUL @ PI8DRE.NLD
- * Dies ist eine bereits hochoptimierte Version von DH5MBC's Sourcen,
- * die Optimierungen sind von DL8HBS. Leider sind sie noch nicht ganz
- * fehlerfrei.
- * Ich würde diese Version überarbeiten und insbesondere die Variablen-
- * zugriffe nocheinmal genauestens überprüfen sowie die Verwendung von
- * Byte-Zugriffen auf die I/O-Adressen anstelle der originalen Word-
- * Zugriffe. Mit geladenem HSMODEM sollte die Interruptbearbeitung
- * dieser Version so schnell sein, dass sich Maus, Tastatur und
- * serielle Schnittstelle nicht gegenseitig aus'interrupten'.
- * Jegliche kommerzielle Verwertung ist untersagt, hieraus hervorge-
- * gangene verbesserte Sourcen MÜSSEN der Allgemeinheit zur Verfügung
- * gestellt werden.
- * Joachim Schurig, DL8HBS, 12/08/93
- *
- * Meine Kommentare sind in Englisch. Es ist also einfach zu sehen was ich
- * hinzugefuegt habe. Habe das Programm noch etwas optimiert durch
- * die Verwendung von Offsets (O_) zu Addressregisters. Dazu musste ich in
- * der RECEIVE ON-Routine a2 verwenden statt a4; a5 ist auf den? Stack
- * gerettet worden und wieder restauriert.
- * Hoffentlich gibt das alles keine Probleme.
- * Ich habe kein Pascal-compiler, so ich kann nicht checken wieviel bugs
- * es noch gibt (hi). Die Routinen habe ich nicht geändert, habe nur einige
- * deutliche Fehler behoben.
- * 73 de Piet, PA3FUL @ PI8DRE.NLD, 16-08-1993.
- *
- * .GLOBL AX_RX_ON,AX_RX_OFF ; Empfang, restore ...
-
- * .XDEF stazei,timer_ve,timerd1,tim_dcont,taste
- * .GLOBL scroll,Spuriosinterr
-
- *
- * Registers MFP 68901
- *
- IERA equ $fffa07 Interrupt enable register A
- ISRA equ $fffa0f Interrupt in-service register A
- AER equ $fffa03 Active edge register (1 l/h=on, 0 h/l=on)
- TADR equ $fffa1f Timer A Data register
- TACR equ $fffa19 Timer A Control register
-
- * inter_mask_reg equ $00fffa15 Interrupt mask register B (NOT used)
-
- *
- * Offset to Base of MFP $fffa00
- *
- mfp equ $fffa00
- *
- O_int_enable_reg equ IERA-mfp
- O_int_serv_reg_a equ ISRA-mfp
- O_aktive_edge_reg equ AER-mfp
- O_timerdat equ TADR-mfp
- O_timercont equ TACR-mfp
-
- *
- * System variables
- *
- vblsem equ $0452 VBlank-handler (1=active)
- keyvec equ $0118 handler IKBD/MIDI interrupt (MFP interr #6)
- rivec equ $0138 Ring indicator (MFP interr #14)
- timer_a_vec equ $0134 MFP interr #13 NOT supported by TOS in ST
- spurios_vec equ $0060 Exception vector 24. Unknown interrupt
-
- *
- * .text
-
- * a4 contains the relocated address of parms throughout the program
- * a4 will be loaded with this address after "trap's" (necessary?)
-
- * a5 contains the base address of the mfp
-
- * The code is position independent
-
- *********************************************
- * RECEIVE ON *
- *********************************************
-
- * function AX_RX_ON(adresse:long_integer):long_integer; external;
-
- AX_RX_ON: move.l 4(sp),d0 ;ADRESSE nach d0
-
- movem.l d0-d7/a0-a6,-(sp) ;register sichern
-
- lea.l parms(pc),a4 reloc. startaddress of params
- move.l a4,a2
- move.w #O_lastparm/2,d1 clear table of params
- clr_lp: clr.w (a2)+ lastparm not cleared!!
- dbra d1,clr_lp
-
- move.l d0,O_sichadr(a4) ;d0 = anfang empfangsspeicher
- addq.l #2,d0 ;erste 2 bytes fuer zahl der empf.
- move.l d0,O_adresse(a4) ;byte reserviert
-
- move.w #255,O_timerd1(a4) ;timer auf 1200 baud
- move.w #5,O_tim_dcont(a4)
-
- clr.l -(sp) ;supervisor
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- lea parms(pc),a4
- move.l d0,O_savestack(a4) ;stackpointer retten
-
- lea Neutast(pc),a2 ;tastaturinterrupt
- move.l keyvec,a3 ;XBRA
- move.l a3,-4(a2)
-
- move.l a2,-(sp)
- move.w #06,-(sp)
- move.w #$d,-(sp) ;neuen interruptvector Tastint
- trap #14 ;übergeben
- addq.l #8,sp
-
- lea Start(pc),a2 ;XBRA ri
- move.l rivec,a3
- move.l a3,-4(a2)
-
- move.l a2,-(sp) relocated startaddress main loop
- move.w #14,-(sp) interrupt #14 of mfp
- move.w #$d,-(sp) set interrupt vector mfp
- trap #14 Xbios
- addq.l #8,sp
-
- move.w #14,-(sp) ;ri interrupt noch sperren
- move.w #$1a,-(sp) No interrupt from mfp
- trap #14 Xbios
- addq.l #4,sp
-
- lea TimerAint(pc),a2
- lea parms(pc),a4
- move.l a2,O_timer_ve(a4)
- movea.l timer_a_vec,a3 save old interr vector #13 (not
- move.l a3,-4(a2) supported by TOS in ST)
- move.l a2,-(sp) pointer interrupt routine
- move.w #255,-(sp) ;1200 baud
- move.w #0,-(sp) ;noch nicht starten
- move.w #0,-(sp) ;timer A (0=timerA)
- move.w #$1f,-(sp) Set timer
- trap #14
- lea 12(sp),sp
-
- lea Spuriosinterr(pc),a2 ;spurios interrupt verbiegen
- movea.l spurios_vec,a3
- move.l a3,-4(a2)
- move.l a2,spurios_vec
-
- move.l savestack,-(sp) ;supervisor aus
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- lea parms(pc),a4 startaddress params
- move.w #15,O_vglwert(a4) ;anfangsparameter setzen
- move.w #32,O_bitwert(a4)
- move.w #208,O_synchwert(a4)
- clr.w O_ri_flag(a4)
- clr.w O_synch_flag(a4)
-
- movem.l (sp)+,d0-d7/a0-a6 ;register restaurieren
- lea.l byteflag(pc),a0 OK with Pascal??
- move.l a0,d0
-
- * movea.l d0,a0 ;rueckgabe ist adresse und turbo-c will
- * rts ;das in a0
-
- * Nun, so sieht das in Pascal aus:
- move.l (sp)+,a0
- addq.l #4,sp
- jmp (a0)
-
- * procedure AX_RX_OFF;external;
-
- *********************************************
- * RECEIVE OFF *
- *********************************************
-
- AX_RX_OFF equ *
- movem.l d0-d7/a0-a6,-(sp) ;register sichern
- clr.l -(sp) ;supervisor
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- lea Start(pc),a0 ;ri zeiger zuruecksetzen
- move.l -4(a0),rivec
-
- lea TimerAint(pc),a0 ;ti zeiger zuruecksetzen
- move.l -4(a0),timer_a_vec
-
- lea.l Spuriosinterr(pc),a0 ;sp_int zeiger zuruecksetzen
- move.l -4(a0),spurios_vec
-
- lea.l Neutast(pc),a0 ;tastatur zeiger zuruecksetzen
- move.l -4(a0),keyvec
-
- lea parms(pc),a4
- move.l O_savestack(a4),-(sp) ;supervisor aus
- move.w #$20,-(sp)
- trap #1
- addq.l #6,sp
-
- movem.l (sp)+,d0-d7/a0-a6 ;register herstellen
- rts
-
- * scroll equ *
- * tst.w d0
- * beq.s scrollret
- * move.l a0,a1
- * add.l #84,a1
- * scrolloop equ *
- * move.l (a1)+,(a0)+
- * dbf d0,scrolloop
- * scrollret equ *
- * rts
-
- XBRAta: dc.b 'XBRA'
- dc.b 'DCST'
- dc.l 0
-
- Neutast: ori.w #$0700,sr ;interruptlevel auf 5 setzen
- andi.w #$f5ff,sr ;somit ri_interrupt waehrend
- move.l Neutast-4(pc),-(sp) ;tastaturinterrupt moeglich
- rts
-
- dc.b 'XBRA'
- dc.b 'DCST'
- dc.l 0
-
- Spuriosinterr equ *
- bra.s TimerAint
-
- dc.b 'XBRA'
- dc.b 'DCST'
- dc.l 0
-
- TimerAint equ * ;Timer A ist abgelaufen...
- movem.l d0-d5/a0-a5,-(sp) ;register sichern, auch a5!
- bsr.s ri_int ;a4 wird in ri_int geladen ??
- *
- * (a4)= relocated address of parms. (a5)= address of mfp
- *
- clr.w -(a2) ;(bytecount)
- addq.l #2,a1 ;a1 = ^sichadr;
- move.l (a1)+,d2 ;(sichadr)
- addq.l #2,d2
- move.l d2,(a2)+ ;(adresse)
- clr.w (a2)+ ;(ri_flag)
- move.w #-1,(a1) ;(status)
- move.w #1,vblsem
- clr.w O_synch_flag(a4)
- clr.b O_timercont(a5) ;timer neu. Stop timer
- addq.l #1,a2
- move.b (a2)+,O_timerdat(a5) ;(timerd1) einstellen
- move.b #159,O_int_serv_reg_a(a5) ;timer u. ri interrupt ist beendet
- movem.l (sp)+,d0-d5/a0-a5 ;register herstellen
- ori.b #96,IERA ;timer u. ri int freigeben
- rte after restoring registers
-
- dc.b 'XBRA'
- dc.b 'DCST'
- dc.l 0
-
- ***********************************************
- * MAIN LOOP *
- ***********************************************
-
- Start: movem.l d0-d5/a0-a5,-(sp) ;register sichern
- clr.w vblsem vblsem inactive
- bsr.s ri_int
- move.b #191,O_int_serv_reg_a(a5) ;interrupt in service loeschen
- movem.l (sp)+,d0-d5/a0-a5 ;register herstellen
- ori.b #96,IERA ;ri und timer int freigeben
- rte AFTER restoring registers
-
- * ACHTUNG: D2 = temporäres Register für bestimmte Rechnungen in ri_int
- * A0 = temporärer Zeiger
- * A1 = temporärer Zeiger
- * A2 = temporärer Zeiger
- * A4 = temporärer Zeiger
- * A5 = temporärer Zeiger (Baseaddress mfp)
-
- ri_int move.l #mfp,a5
- andi.b #159,O_int_enable_reg(a5) ;timer und ri interrupt sperren
- bchg.b #6,O_aktive_edge_reg(a5) ;naechster interrupt bei anderer flanke
-
- move.w #255,d0 ;d0 = 255 - timerdat. moveq not allowed
- sub.b O_timerdat(a5),d0 ;entspricht timerschritte seit letztem interrupt
-
- clr.w d4
- lea parms(pc),a4 ;a4 = ^parms (bleibt so!)
- lea O_byte(a4),a0 ;a0 = ^byte (bleibt so!)
- lea O_bitcount(a4),a1 ;a1 = ^bitcount (bleibt so!)
- lea O_bytecount(a4),a2 ;a2 = ^bytecount (läuft hoch!)
- move.w (a2)+,d5 ;(bytecount)
- move.l (a2)+,a3 ;(adresse)
- tst.w (a2) ;(ri_flag) evtl TAS ???
- bne.s kein_sta_zei
- move.w #-1,O_status(a4)
-
- kein_sta_zei equ *
- move.w #-1,(a2)+ ;(ri_flag)
- move.b d4,O_timercont(a5) ;timer neu , d4 ist 0
- addq.l #1,a2
- move.b (a2)+,O_timerdat(a5) ;starten (timerd1)
- addq.l #1,a2
- move.b (a2)+,O_timercont(a5) ;(tim_dcont)
- ori.b #32,O_int_enable_reg(a5)
- move.b #223,O_int_serv_reg_a(a5)
-
- move.w (a2),d3 ;(vorher)
- move.w d0,(a2)+
-
- tst.w (a2)+ ;(synch_flag) wenn synchronisation noch nicht
- beq.s loop ;erfolgte ist kein stuffing möglich
-
- move.w (a2)+,d2 ;(synchwert)
-
- tst.w d5 ;sind bereits bytes empfangen worden
- bne.s evtl_endsynch ;muss ein impuls > 7;32-16 ein endsynch sein
-
- cmp.w d2,d0 ;(synchwert)
- bge.s ri_ruecksprung
- cmp.w d2,d3 ;(synchwert)
- bge.s ri_ruecksprung
- bra.s kein_7E
-
- frame_end addq.l #2,a1 ;(a1 = ^sichadr)
- move.l (a1),a2 ;(sichadr)
- move.w d5,d3 ;anzahl der empfangenen bytes sichern
- move.b d3,(a2)+
- lsr.w #8,d3
- move.b d3,(a2)
- clr.w d5 ;bytecount = 0
- move.l a3,(a1) ;(sichadr)
- addq.l #2,a3
- clr.w (a1) ;(bitcount)
- clr.w O_synch_flag(a4)
- subq.l #2,a1 ;(a1 = ^bitcount)
-
- ri_ruecksprung equ *
- lea O_bytecount(a4),a2
- move.w d5,(a2)+ ;(bytecount)
- move.l a3,(a2) ;(adresse)
- rts ;ruecksprung
-
- evtl_endsynch equ *
- cmp.w d2,d3 ;(synchwert)
- bge.s frame_end
-
- kein_7E: move.w d3,d0
-
- loop: move.l a0,a2 ;a2 steht auf ^byte
- move.w (a2)+,d1 ;(byte) bis jetzt empf byte nach d1
- sub.w (a2)+,d0 ;(bitwert) timerschritte minus bitwert
-
- cmp.w (a2),d0 ;(vglwert) wenn rest > 16
- ble.s null_setzten
-
- bset #7,d1 ;war empf bit eine 1
- addq.w #1,d4
- bra.s vergleich
-
- null_setzten equ * * sonst war es eine null
- bclr #7,d1
- cmpi.w #5,d4
- bne.s mach_null
- clr.w d4
- bra.s nix_schiebens
-
- mach_null clr.w d4
-
- vergleich lea O_synch_flag(a4),a2 ;a2 = ^synch_flag
- tst.w (a2) ;(synch_flag) wenn synchbyte schon empf
- bne.s aufnahme ;dann springe zu aufnahme
-
- cmpi.w #$7e,d1 ;wenn byte in d1 = 7e = synchronbyte
- bne.s schieben
-
- move.w #$ff,(a2) ;(synch_flag) synchronflag setzten
- clr.w (a0) ;(byte)
- clr.w (a1) ;(bitcount)
- clr.w d4
- bra.s nix_schiebens
-
- aufnahme: cmpi.w #7,(a1) ;(bitcount)
- bne.s schieben
-
- move.b d1,(a3)+ ;byte in adresse schreiben und adresse um eins erhöhen
- clr.w (a1) ;(bitcount) bitcount =0
- clr.w (a0) ;(byte)
- addq.w #1,d5 ;bytecount erhöhen
- bra.s nix_schiebens
-
- schieben lsr.b #1,d1 ;byte um 1 stelle nach rechts schiebne
- move.w d1,(a0) ;(byte)
- addq.w #1,(a1) ;(bitcount)
-
- nix_schiebens equ *
- cmp.w O_vglwert(a4),d0 ;wenn wert in d0 >16
- ble.s ri_ruecksprung
- bra.s loop ;dann zu neuem durchlauf
-
- * .bss
- *
- *
- parms equ * * REIHENFOLGE DER ADRESSEN NICHT VERÄNDERN!!!!!!!!!
- timer_ve: ds.l 1
- oldkey: ds.l 1
- savestack: ds.l 1
- byteflag: ds.w 1
-
- bytecount: ds.w 1
- adresse: ds.l 1
- ri_flag: ds.w 1
- timerd1: ds.w 1
- tim_dcont: ds.w 1
- vorher: ds.w 1
- synch_flag: ds.w 1
- synchwert: ds.w 1
- byte: ds.w 1
- bitwert: ds.w 1
- vglwert: ds.w 1
-
- bitcount: ds.w 1
- sichadr: ds.l 1
- status: ds.w 1
- lastparm ds.w 1
-
- *
- * Offset params
- *
-
- O_timer_ve equ timer_ve-parms
- O_oldkey equ oldkey-parms
- O_savestack equ savestack-parms
- O_byteflag equ byteflag-parms
-
- O_bytecount equ bytecount-parms
- O_adresse equ adresse-parms
- O_ri_flag equ ri_flag-parms
- O_timerd1 equ timerd1-parms
- O_tim_dcont equ tim_dcont-parms
- O_vorher equ vorher-parms
- O_synch_flag equ synch_flag-parms
- O_synchwert equ synchwert-parms
- O_byte equ byte-parms
- O_bitwert equ bitwert-parms
- O_vglwert equ vglwert-parms
-
- O_bitcount equ bitcount-parms
- O_sichadr equ sichadr-parms
- O_status equ status-parms
- O_lastparm equ lastparm-parms
- end
-
- 27Sep93/1107 Subject: TFSTX... Bulletin ID: 279301DB0SHG
- Path: DB0RBS!DB0MWE!DB0LAN!DB0BOX!DB0HOF!DB0SON!DB0SIF!DB0GV!DB0LJ!DB0GE!DB0IZ!DK0MWX!DB0EAM!DK0MAV!DB0SHG
- de DC7OS @ DB0SHG.NDS.DEU.EU to ATARI @ DL Moin, moin!
- In den letzten Wochen habe ich mehr oder weniger unregelmäßig davon gelesen,
- daß da ein paar Leute dransitzen TFSTX (also einen Treiber für das
- BayCom-Modem am ST) zu schreiben.
- Ich habe mir mal die Hardwarebeschreibung des Falcons etwas genauer angesehen
- und dabei festgestellt, das der DSP da ja eigentlich auch PR machen könnte.
- Vielleicht bedenkt der eine oder andere Programmentwickler dieses und
- erstellt das TFSTX in 2 Teilen. Ein Teil für die softwaremäßige Steuerung,
- ein anderer Teil mit dem hardwareabhängigem Teil. Dieser sollte dann z.B.
- leicht austauschbar sein, um wahlweise ein BayCom-Modem an der seriellen
- Schnittstelle oder den DSP als Modem zu betreiben.
- Das waren nun nur mal so ein paar Gedanken dazu. Vielleicht greift die ja wer
- auf.
- 73! Karsten, DC7OS @DB0SHG.DEU.EU in Garbsen (JO42TK)
-
-